#!/bin/bash

# macOS 12和14应用程序双向共享脚本
# 版本: 1.0

# 基本设置
SHARED_DIR="/Volumes/Sun/SharedApps"
TARGET_DIR="/Applications"
LOG_DIR="$HOME/.mac_sync/logs"
LOG_FILE="$LOG_DIR/app_sync_$(date +%Y%m%d-%H%M%S).log"
CURRENT_OS_VERSION=$(sw_vers -productVersion | cut -d. -f1)

# 创建必要的目录
mkdir -p "$SHARED_DIR"
mkdir -p "$LOG_DIR"

# 记录日志函数
log_message() {
    echo "[$(date +%Y-%m-%d\ %H:%M:%S)] $1" | tee -a "$LOG_FILE"
}

log_message "开始应用同步 - 当前系统版本: macOS $CURRENT_OS_VERSION"
log_message "========================================"

# 检查外部卷是否挂载
if [ ! -d "$SHARED_DIR" ]; then
    log_message "错误: $SHARED_DIR 目录不存在，请确保外部卷已正确挂载"
    exit 1
fi

# 检查目标目录的写入权限
if [ ! -w "$TARGET_DIR" ]; then
    log_message "警告: 没有 $TARGET_DIR 的写入权限，尝试使用sudo运行"
    echo "请输入您的密码以获取管理员权限:"
    sudo "$0"
    exit $?
fi

# 函数: 设置开机自动启动
setup_autostart() {
    log_message "设置开机自动启动..."
    
    local plist_file="$HOME/Library/LaunchAgents/com.user.appsharing.plist"
    local script_path=$(realpath "$0")
    
    cat > "$plist_file" << EOF
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Label</key>
    <string>com.user.appsharing</string>
    <key>ProgramArguments</key>
    <array>
        <string>$script_path</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>StandardErrorPath</key>
    <string>$LOG_DIR/appsharing_error.log</string>
    <key>StandardOutPath</key>
    <string>$LOG_DIR/appsharing_output.log</string>
</dict>
</plist>
EOF

    # 加载启动项
    launchctl unload "$plist_file" 2>/dev/null
    launchctl load -w "$plist_file"
    log_message "开机自动启动设置完成"
}

# 函数: 是否为系统应用
is_system_app() {
    local app_name="$1"
    
    # 系统应用列表
    local system_apps=(
        "App Store.app"
        "Automator.app"
        "Calculator.app"
        "Calendar.app"
        "Chess.app"
        "Contacts.app"
        "Dictionary.app"
        "FaceTime.app"
        "Freeform.app"
        "Home.app"
        "Image Capture.app"
        "Launchpad.app"
        "Mail.app"
        "Maps.app"
        "Messages.app"
        "Mission Control.app"
        "Music.app"
        "News.app"
        "Notes.app"
        "Photo Booth.app"
        "Photos.app"
        "Podcasts.app"
        "Preview.app"
        "QuickTime Player.app"
        "Reminders.app"
        "Safari.app"
        "Shortcuts.app"
        "Siri.app"
        "Stickies.app"
        "Stocks.app"
        "System Information.app"
        "System Preferences.app"
        "System Settings.app"
        "TextEdit.app"
        "Time Machine.app"
        "TV.app"
        "Utilities"
        "Voice Memos.app"
        "Weather.app"
    )
    
    for sys_app in "${system_apps[@]}"; do
        if [[ "$app_name" == "$sys_app" ]]; then
            return 0  # 是系统应用
        fi
    done
    
    return 1  # 不是系统应用
}

# 函数: 同步本地应用到共享目录
sync_local_to_shared() {
    log_message "开始同步本地应用到共享目录..."
    
    for app in "$TARGET_DIR"/*.app; do
        # 跳过不存在的匹配 (如果没有.app文件)
        [ -e "$app" ] || continue
        
        app_name=$(basename "$app")
        
        # 跳过系统应用和已链接应用
        if is_system_app "$app_name" || [ -L "$app" ]; then
            continue
        fi
        
        # 移动到共享目录
        if [ ! -e "$SHARED_DIR/$app_name" ]; then
            log_message "移动 $app_name 到共享目录"
            mv "$app" "$SHARED_DIR/"
            ln -s "$SHARED_DIR/$app_name" "$TARGET_DIR/$app_name"
            log_message "完成: $app_name 已移动并创建链接"
        else
            log_message "跳过: $app_name 已在共享目录中存在"
        fi
    done
    
    log_message "本地应用同步完成"
}

# 函数: 创建链接到共享目录中的应用
create_links_from_shared() {
    log_message "开始从共享目录创建应用链接..."
    
    for app in "$SHARED_DIR"/*.app; do
        # 跳过不存在的匹配
        [ -e "$app" ] || continue
        
        app_name=$(basename "$app")
        
        # 检查目标目录中是否已存在该应用
        if [ ! -e "$TARGET_DIR/$app_name" ]; then
            log_message "创建链接: $app_name"
            ln -s "$app" "$TARGET_DIR/$app_name"
        elif [ -L "$TARGET_DIR/$app_name" ]; then
            # 检查链接是否指向正确位置
            link_target=$(readlink "$TARGET_DIR/$app_name")
            if [ "$link_target" != "$app" ]; then
                log_message "更新链接: $app_name"
                rm "$TARGET_DIR/$app_name"
                ln -s "$app" "$TARGET_DIR/$app_name"
            fi
        else
            log_message "警告: $app_name 已在目标目录中存在且不是链接"
        fi
    done
    
    log_message "共享应用链接创建完成"
}

# 函数: 清理无效链接
clean_broken_links() {
    log_message "开始清理损坏的链接..."
    
    for app_link in "$TARGET_DIR"/*.app; do
        # 只处理符号链接
        if [ -L "$app_link" ]; then
            link_target=$(readlink "$app_link")
            # 检查链接是否指向外部卷并且目标不存在
            if [[ "$link_target" == "$SHARED_DIR"* ]] && [ ! -e "$link_target" ]; then
                app_name=$(basename "$app_link")
                log_message "删除损坏的链接: $app_name"
                rm "$app_link"
            fi
        fi
    done
    
    log_message "损坏链接清理完成"
}

# 主函数
main() {
    log_message "====== 开始应用同步过程 ======"
    
    # 1. 同步本地应用到共享目录
    sync_local_to_shared
    
    # 2. 从共享目录创建链接
    create_links_from_shared
    
    # 3. 清理损坏的链接
    clean_broken_links
    
    # 4. 设置开机自动启动
    setup_autostart
    
    log_message "====== 应用同步完成 ======"
}

# 执行主函数
main

echo ""
echo "===== 应用同步完成 ====="
echo "共享应用目录: $SHARED_DIR"
echo "应用链接目录: $TARGET_DIR"
echo "日志文件位置: $LOG_FILE"
echo ""
echo "提示: 此脚本已设置为开机自动运行，以保持两个系统的应用同步" 